from collections import deque
#将列表当做堆栈使用
#堆栈作为特定的数据结构，最先进入的元素最后一个被释放（后进先出）。用 append() 方法可以把一个元素添加到堆栈顶。用不指定索引的 pop() 方法可以把一个元素从堆栈顶释放出来
def Listtostack():
    stack = [2,3,4]
    stack.append(5)
    stack.append(6)
    print("压入元素",stack)
    stack.pop()
    stack.pop()
    print("弹出元素",stack)
    return

#将列表当作队列使用
#可以把列表当做队列用，只是在队列里第一加入的元素，第一个取出来；但是拿列表用作这样的目的效率不高。在列表的最后添加或者弹出元素速度快，然而在列表里插入或者从头部弹出速度却不快（因为所有其他的元素都得一个一个地移动）
def Listtoqueue():
    queue = deque(["Eric", "John", "Michael"])
    queue.append("Terry")
    queue.append("Graham")
    print("元素进入队列", queue)
    queue.popleft()
    queue.popleft()
    print("元素出队列", queue)
    return

#列表推导式
def fun1():
    list = [2,5,8]
    newlist = [3 * x for x in list]
    print("列表中每个数值乘三",newlist)
    newlist2 = [3*x for x in list if x > 3]  #if做条件过滤器
    print("使用过滤器后列表中每个大于3的数值乘三", newlist2)
    listx = [2,3,4]
    listy = [5,6,7]
    newlist3 = [x*y for x in listx for y in listy] #循环相乘
    newlist4 = [x+y for x in listx for y in listy] #循环相加
    print("循环相乘",newlist3)
    print("循环相加",newlist4)

#解析矩阵
def fun2():
    matrix = [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 10, 11, 12],
        ]
    print("解析后将3X4的矩阵列表转换为4X3列表：")
    print([[row[i] for row in matrix] for i in range(4)])


#del()使用 del 语句可以从一个列表中依索引而不是值来删除一个元素。这与使用 pop() 返回一个值不同。可以用 del 语句从列表中删除一个切割，或清空整个列表
def fun3():
    test1 = [3,2,5,8,4,7,6,9]
    del test1[0]
    print("删除列表第一个值",test1)
    del test1[2:5]
    print("删除列表下标索引2-5的值",test1)
    del test1[:]
    print("删除整个列表",test1)
    return


#元组 不可变
def fun4():
    t = 123,567,"nike","addias"
    print(t[3])
    print(t)
    u = t,(3,2,5,8,4,7,6,9)
    print(u)#嵌套元组,元组在输出时总是有括号的，以便于正确表达嵌套结构
    return


#集合 集合是一个无序不重复元素的集。基本功能包括关系测试和消除重复元素。set()
def fun5():
    s = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
    print(s)#删除重复
    print('orange' in s )#检测成员
    print('crabgrass' in s)

    a = set('abracadabra')
    b = set('alacazam')
    print(a-b) #在 a 中的字母，但不在 b 中
    print(a|b) #在 a 或 b 中的字母
    print(a&b) #在 a 和 b 中都有的字母
    print(a^b) #在 a 或 b 中的字母，但不同时在 a 和 b 中
    #推导式
    a1 = {x for x in 'abracadabra' if x not in 'abc'}
    print(a1)

    return


#字典，序列是以连续的整数为索引，与此不同的是，字典以关键字为索引，关键字可以是任意不可变类型，通常用字符串或数值。一对大括号创建一个空的字典：{}。
def fun6():
    teldict = {'jack': 4098, 'sape': 4139}
    teldict['Edward'] = 3258
    print(teldict)
    del teldict['sape']
    teldict['john'] = 4769
    print(teldict)
    print("字典中的键",list(teldict.keys()))#sorted()排序
    print("字典中的值",list(teldict.values()))
    print('sape' in teldict)
    print('john' in teldict)
    return

#字典遍历
def fun7():
    knights = {'gallahad': 'the pure', 'robin': 'the brave'}
    for k, v in knights.items(): #items()
        print(k, v)

    return

#同时遍历更多的集合可以采用zip()组合
def fun8():
    questions = ['name', 'quest', 'favorite color']
    answers = ['lancelot', 'the holy grail', 'blue']
    for q, a in zip(questions, answers):
        print('What is your {0}?  It is {1}.'.format(q, a))
    return

#要按顺序遍历一个序列，使用 sorted() 函数返回一个已排序的序列，并不修改原值
def fun9():
    basket = ['apple', 'orange', 'apple', 'pear', 'orange', 'banana']
    for f in sorted(set(basket)): #set()去重
        print(f)
    return

if __name__ == '__main__':
    Listtostack()
    Listtoqueue()
    fun1()
    fun2()
    fun3()
    fun4()
    fun5()
    fun6()
    fun7()
    fun8()
    fun9()

    for x in range(1, 11):
        print(repr(x).rjust(2), repr(x * x).rjust(3), end=' ')
        print(repr(x * x * x).rjust(4))

    for x in range(1, 11):
        print('{0:2d} {1:3d} {2:4d}'.format(x, x * x, x * x * x))